home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / dirxcpp / spider.cpp < prev    next >
C/C++ Source or Header  |  1998-10-06  |  5KB  |  143 lines

  1. //
  2. // DirectXCCP 6.0, Copyright (C) 1998, Weston Software.  All Rights Reserved.
  3. // See the documentation for specific license details.
  4. //
  5. #include "dxcpp.h"
  6. #include "resource.h"
  7. #include "spider.h"
  8.  
  9. extern CADirect3DRM *pD3D;
  10.  
  11. ////////////////////////////////////////////////////////////////
  12. ////////////////////////////////////////////////////////////////
  13. CASpider::CASpider( CADirect3DRM *pD3D, LPDIRECT3DRMFRAME pRef ) :
  14.   CADirect3DRMFrame( pD3D, pRef )
  15. {
  16.   D3DRMLOADRESOURCE res = { NULL, NULL, "XOF" };
  17.   
  18.   m_iTick = 0;
  19.   m_iTickLeft = 0;
  20.   m_iTickRight = 0;
  21.  
  22.   // load the spider's body
  23.     m_pMeshBuilder = new CADirect3DRMMeshBuilder( pD3D );
  24.   res.lpName = MAKEINTRESOURCE( IDR_SPIDER );
  25.   m_pMeshBuilder->Load( &res, NULL, D3DRMLOAD_FROMRESOURCE | D3DRMLOAD_FIRST, NULL, NULL);
  26.   m_pMeshBuilder->Scale( D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5));
  27.     AddVisual( m_pMeshBuilder->I() );
  28.  
  29.   // load the spider's head
  30.   m_pHead = new CADirect3DRMFrame( pD3D, NULL );
  31.     CADirect3DRMMeshBuilder *pHeadMesh = new CADirect3DRMMeshBuilder( pD3D );
  32.   res.lpName = MAKEINTRESOURCE( IDR_SPIDER1 );
  33.   pHeadMesh->Load( &res, NULL, D3DRMLOAD_FROMRESOURCE | D3DRMLOAD_FIRST, NULL, NULL);
  34.   pHeadMesh->Scale( D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5));
  35.   m_pHead->AddVisual( pHeadMesh->I() );
  36.   AddVisual( m_pHead->I() );
  37.   delete pHeadMesh;
  38.  
  39.   // load the spider's legs
  40.   m_pLeftLeg = new CADirect3DRMFrame( pD3D, NULL );
  41.     m_pMeshLeft = new CADirect3DRMMeshBuilder( pD3D );
  42.   res.lpName = MAKEINTRESOURCE( IDR_SPIDER2 );
  43.   m_pMeshLeft->Load( &res, NULL, D3DRMLOAD_FROMRESOURCE | D3DRMLOAD_FIRST, NULL, NULL);
  44.   m_pMeshLeft->Scale( D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5));
  45.   m_pLeftLeg->AddVisual( m_pMeshLeft->I() );
  46.   AddVisual( m_pLeftLeg->I() );
  47.  
  48.   m_pRightLeg = new CADirect3DRMFrame( pD3D, NULL );
  49.     m_pMeshRight = new CADirect3DRMMeshBuilder( pD3D );
  50.   res.lpName = MAKEINTRESOURCE( IDR_SPIDER3 );
  51.   m_pMeshRight->Load( &res, NULL, D3DRMLOAD_FROMRESOURCE | D3DRMLOAD_FIRST, NULL, NULL);
  52.   m_pMeshRight->Scale( D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5));
  53.   m_pRightLeg->AddVisual( m_pMeshRight->I() );
  54.   AddVisual( m_pRightLeg->I() );
  55.  
  56.   // setup the spider's movement
  57.   D3DRMANIMATIONOPTIONS opt = 
  58.     D3DRMANIMATION_CLOSED | D3DRMANIMATION_SCALEANDROTATION;
  59.   m_pAniHead = new CADirect3DRMAnimation( pD3D );
  60.   m_pAniHead->SetOptions( opt );
  61.   m_pAniHead->SetFrame( m_pHead->I() );
  62.  
  63.   // move the head
  64.   D3DRMQUATERNION quat;
  65.   D3DVECTOR vAxis = {0, 1, 0 };
  66.   D3DRMQuaternionFromRotation( &quat, &vAxis, 0 );   
  67.   m_pAniHead->AddRotateKey( 0, &quat );
  68.  
  69.   D3DRMQuaternionFromRotation( &quat, &vAxis, .25 );
  70.   m_pAniHead->AddRotateKey( 100, &quat );
  71.  
  72.   D3DRMQuaternionFromRotation( &quat, &vAxis, -.25 );
  73.   m_pAniHead->AddRotateKey( 200, &quat );
  74.  
  75.   D3DRMQuaternionFromRotation( &quat, &vAxis, 0 );   
  76.   m_pAniHead->AddRotateKey( 300, &quat );
  77.  
  78.   D3DVECTOR vYAxis = { 0, 1, 0 };
  79.   D3DVECTOR vZAxis = { 0, 0, 1 };
  80.  
  81.   // move the left leg
  82.   m_pAniLeft = new CADirect3DRMAnimation( pD3D );
  83.   m_pAniLeft->SetOptions( opt );
  84.   m_pAniLeft->SetFrame( m_pLeftLeg->I() );
  85.  
  86.   D3DRMQuaternionFromRotation( &quat, &vYAxis, 0 );   
  87.   m_pAniLeft->AddRotateKey( 0, &quat );
  88.  
  89.   D3DRMQuaternionFromRotation( &quat, &vYAxis, D3DVALUE(.16) );
  90.   m_pAniLeft->AddRotateKey( 100, &quat );
  91.  
  92.   D3DRMQuaternionFromRotation( &quat, &vZAxis, D3DVALUE(.16) );
  93.   m_pAniLeft->AddRotateKey( 150, &quat );
  94.  
  95.   D3DRMQuaternionFromRotation( &quat, &vYAxis, D3DVALUE(-.16) );
  96.   m_pAniLeft->AddRotateKey( 200, &quat );
  97.  
  98.   D3DRMQuaternionFromRotation( &quat, &vYAxis, 0 );   
  99.   m_pAniLeft->AddRotateKey( 300, &quat );
  100.  
  101.   // move the right leg
  102.   m_pAniRight = new CADirect3DRMAnimation( pD3D );
  103.   m_pAniRight->SetOptions( opt );
  104.   m_pAniRight->SetFrame( m_pRightLeg->I() );
  105.  
  106.   D3DRMQuaternionFromRotation( &quat, &vYAxis, 0 );   
  107.   m_pAniRight->AddRotateKey( 0, &quat );
  108.  
  109.   D3DRMQuaternionFromRotation( &quat, &vYAxis, D3DVALUE(-.16) );
  110.   m_pAniRight->AddRotateKey( 100, &quat );
  111.  
  112.   D3DRMQuaternionFromRotation( &quat, &vZAxis, D3DVALUE(-.16) );
  113.   m_pAniRight->AddRotateKey( 150, &quat );
  114.  
  115.   D3DRMQuaternionFromRotation( &quat, &vYAxis, D3DVALUE(.16) );
  116.   m_pAniRight->AddRotateKey( 200, &quat );
  117.  
  118.   D3DRMQuaternionFromRotation( &quat, &vYAxis, 0 );   
  119.   m_pAniRight->AddRotateKey( 300, &quat );
  120. }
  121.  
  122. CASpider::~CASpider()
  123. {
  124.   delete m_pMeshBuilder;
  125.   delete m_pMeshLeft;
  126.   delete m_pMeshRight;
  127.   delete m_pAniHead;  
  128.   delete m_pAniLeft;
  129.   delete m_pAniRight;
  130.  
  131.   delete m_pHead;  
  132.   delete m_pLeftLeg;  
  133.   delete m_pRightLeg;
  134. }
  135.  
  136. void CASpider::Tick()
  137. {
  138.   m_pAniHead->SetTime( D3DVALUE( m_iTick = (m_iTick += 10) % 300 ));
  139.   m_pAniLeft->SetTime( D3DVALUE( m_iTickLeft = (m_iTickLeft += 6) % 300 ));
  140.   m_pAniRight->SetTime( D3DVALUE( m_iTickRight = (m_iTickRight += 6) % 300 ));
  141. }
  142.  
  143.